package com.qf.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.qf.constant.MessageConstant;
import com.qf.dao.MemberDao;
import com.qf.dao.OrderDao;
import com.qf.dao.OrderSettingDao;
import com.qf.entity.Result;
import com.qf.pojo.Member;
import com.qf.pojo.Order;
import com.qf.pojo.OrderSetting;
import com.qf.service.OrderService;
import com.qf.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zhouhao
 * @create 2021-12-24 19:40
 */
@Service(interfaceClass = OrderService.class)
@Transactional
public class OrderServiceImpl implements OrderService {

    @Autowired
    OrderSettingDao orderSettingDao;
    @Autowired
    OrderDao orderDao;
    @Autowired
    MemberDao memberDao;

    /**
     * 1、检查用户所选择的预约日期是否已经提前进行了预约设置，如果没有设置则无法进行预约
     * 2、检查用户所选择的预约日期是否已经约满，如果已经约满则无法预约
     * 3、检查当前用户是否为会员，如果是会员则直接完成预约，如果不是会员则自动完成注册并进行预约
     * 4、检查用户是否重复预约（同一个用户在同一天预约了同一个套餐），如果是重复预约 则无法完成再次预约
     * 5、预约成功，更新当日的已预约人数
     *
     * @param map
     * @return
     */
    @Override
    public Result addOrder(Map map) {
        String date = (String) map.get("orderDate");
        try {
            Date orderDate = DateUtils.parseString2Date(date);
//            1、检查用户所选择的预约日期是否已经提前进行了预约设置，如果没有设置则无法进行预约
            OrderSetting orderSetting = orderSettingDao.findOrderSettingByOrderDate(orderDate);
            if (orderSetting == null) {
                //不能预约
                return new Result(false, MessageConstant.SELECTED_DATE_CANNOT_ORDER);
            }
//            2、检查用户所选择的预约日期是否已经约满，如果已经约满则无法预约
            int number = orderSetting.getNumber();//获取当天可预约人数
            int reservations = orderSetting.getReservations();//获取当天已经预约的人数
            if (number == reservations) {
                //已经约满
                return new Result(false, MessageConstant.ORDER_FULL);
            }
//            3、检查当前用户是否为会员，如果是会员则直接完成预约，如果不是会员则自动完成注册并进行预约
            String telephone = (String) map.get("telephone");
            Member member = memberDao.findmemberByTelephone(telephone);
            if (member != null) {
//            4.检查用户是否重复预约（同一个用户在同一天预约了同一个套餐），如果是重复预约 则无法完成再次预约
                Integer memberId = member.getId();
                String setmealId = (String) map.get("setmealId");
                HashMap<String, Object> orderMap = new HashMap<>();
                orderMap.put("memberId", memberId);
                orderMap.put("setmealId", setmealId);
                orderMap.put("orderDate", date);
                Order order = orderDao.findOrderByCondition(orderMap);
                if (order != null) {
                    //当前会员已经预约过相关的套餐
                    return new Result(false, MessageConstant.HAS_ORDERED);
                }

            } else {
                member = new Member();
                member.setName((String) map.get("name"));
                member.setSex((String) map.get("sex"));
                member.setPhoneNumber(telephone);
                member.setRegTime(new Date());
                member.setIdCard((String) map.get("idCard"));
                memberDao.addMember(member);
            }
            // 5、预约成功，更新当日的已预约人数
            orderSetting.setReservations(orderSetting.getReservations() + 1);
            int reservationsTest = orderSetting.getReservations();
            orderSettingDao.updateReservations(orderSetting);
            //将预约信息保存到order里面去
            Order order = new Order(member.getId(), orderDate, Order.ORDERTYPE_WEIXIN, Order.ORDERSTATUS_NO, Integer.parseInt((String) map.get("setmealId")));
            orderDao.addOrder(order);
            return new Result(true, MessageConstant.ORDER_SUCCESS, order.getId());
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, "添加预约失败");
        }
    }

    //根据id查询预约信息，包括套餐信息和会员信息
    @Override
    public Map<String,Object> findById(Integer id) {
        Map<String,Object> map = orderDao.findById(id);
        if (map != null) {
            Date orderDate = (Date) map.get("orderDate");
            try {
                map.put("orderDate",DateUtils.parseDate2String(orderDate));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return map;
    }
}
